package services;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.swing.text.MaskFormatter;

import utilities.CompararFornecedor;

import daoHibernate.FornecedorHibernateDao;
import entidades.Avaliacao;
import entidades.Fornecedor;
import entidades.ItemRequisicao;
import entidades.Pedido;
import entidades.Produto;
import entidades.SolicitacaoCotacao;
import flex.messaging.FlexContext;

public class FornecedorService {
	
	/**
	 * Grava pedido na sessao para Avaliar o fornecedor
	 * @param forn
	 * @return
	 */	
	public void setAvaliarFornecedor(Pedido pedido){
		
		FlexContext.getFlexSession().setAttribute("avaliarFornecedor", pedido);
		
	}
	
	/**
	 * Pega pedido da sessao para Avaliar o fornecedor
	 * @param forn
	 * @return
	 */
	public Pedido getAvaliarFornecedor(){
		Pedido ped = (Pedido) FlexContext.getFlexSession().getAttribute(
				"avaliarFornecedor");
		FlexContext.getFlexSession().setAttribute("avaliarFornecedor", null);


		return ped;		

	}

	public boolean gravarFornecedor(Fornecedor forn){
		
		boolean retorno;
		
		FornecedorHibernateDao fornd = new FornecedorHibernateDao();
		
		retorno = fornd.save(forn);

		return retorno;
		
	}

public boolean addAvaliacao(Avaliacao avaliacao){
		
		boolean retorno;
		
		FornecedorHibernateDao fornd = new FornecedorHibernateDao();
		
		retorno = fornd.saveAvaliacao(avaliacao);

		return retorno;
		
	}

public List<Fornecedor> buscarFornecedor( long numFornecedor, String razaoSocial, String nomeFantasia, String email, List<ItemRequisicao> itens){				
	List<Fornecedor> forn = new ArrayList<Fornecedor>();				
	forn = new FornecedorHibernateDao().searchFornecedorList(numFornecedor, razaoSocial, nomeFantasia, email);	
	String mascara;
	List<Fornecedor> fornecedores = new ArrayList<Fornecedor>();
	
	Collections.sort(forn, new CompararFornecedor());
	for (ItemRequisicao item : itens) {

		for (Fornecedor fornecedor : forn) {

			for (Produto prod : fornecedor.getProdutos()) {

				Long a = prod.getNcm(), b = item.getProduto().getNcm();

				if (a.equals(b)) {
					if (!fornecedores.contains(fornecedor)) {
						fornecedores.add(fornecedor);
						break;
					}
				}
			}
		}
	}

	
	
	for (Fornecedor fornecedor : fornecedores) {
		
		mascara = fornecedor.getIdFornecedor().toString();		
		
		MaskFormatter mf = null;
		try {
			mf = new MaskFormatter("##.###.###/####-##");
			mf.setValueContainsLiteralCharacters(false);
	        
	        fornecedor.setmCnpj(mf.valueToString(mascara));
	        
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
				
	}
	
	return fornecedores;
}

public boolean calculaMediaFornecedor(Avaliacao avaliacao){
	
	Double condicaoPagamento;
	Double valor;
	Double comunicacao;
	Double prazoEntrega;
	Double negociacao;
	Double conformidade;
	Double media;
	
	FornecedorHibernateDao fornD = new FornecedorHibernateDao();
	
//	List<Avaliacao> avaliacoes = fornD.searchAvaliacaoList(forn);
//	
//	for (Avaliacao avaliacao : avaliacoes) {
//	
//		condicaoPagamento = condicaoPagamento + avaliacao.getCondicaoPagamento();
//		valor = valor + avaliacao.getValor();
//		comunicacao = comunicacao + avaliacao.getComunicacao();
//		prazoEntrega = prazoEntrega + avaliacao.getPrazoEntrega();
//		negociacao = negociacao + avaliacao.getNegociacao();
//		conformidade = conformidade + avaliacao.getConformidade();
//		
//	}		
	
	condicaoPagamento = Double.valueOf(avaliacao.getCondicaoPagamento());
	valor = Double.valueOf(avaliacao.getValor());
	comunicacao = Double.valueOf(avaliacao.getComunicacao());
	prazoEntrega = Double.valueOf(avaliacao.getPrazoEntrega());
	negociacao = Double.valueOf(avaliacao.getNegociacao());
	conformidade = Double.valueOf(avaliacao.getConformidade());
	
	media = condicaoPagamento + valor + comunicacao + prazoEntrega + negociacao + conformidade;  
	
	media = media / 6;
	
	media = (media + avaliacao.getFornecedor().getPontuacaoMedia()) / 2;
		
	Fornecedor fornecedor = fornD.searchFornecedor(avaliacao.getFornecedor().getIdFornecedor());
	
	fornecedor.setPontuacaoMedia(media);
	
	return fornD.update(fornecedor);
	
}

	
}
